Mark's blog

Content



简介

二叉树大家应该比较熟悉了, 而这个分形是什么意思呢? 简单的说就是大图形和其生成的小图形在形状上是一样的, 比如想象一下把一套俄罗斯套娃连在一起摆放. 这次是使用Python自带的小海龟加上函数递归的方式来画这个二叉分形树

参考资料

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
from turtle import *


# 画树枝(分支)函数, 可选参数有最大树枝长度, 分叉角度(与铅垂线), 最粗画笔宽度, 初始画笔颜色
# 可以自动变化画笔的粗细, 也可以自动改变画笔颜色
def branch(length:float=160.0, angle:float=30.0, w:float=16.0, r:int=0, g:int=0, b:int=0) -> None:
# 设置画笔宽度
w *= 0.8
width(w)
# 设置当前分支的颜色
r += 10
g += 20
b += 30
pencolor(r % 200, g % 200, b % 200)

# 自动缩减下一分支的长度
length *= 0.8
# 左转45度
lt(angle)
# 前进画树枝
fd(length)

# 下面的递归逻辑可能有些不太好理解, 所以做一些必要的注释
# 画树枝的顺序是先画左枝, 再画右枝
# 左枝画完后退回上个点, 转过去再画右枝, 也就是这个过程中使用递归

# 画当前左枝的下个左枝
if length > 10.0:
branch(length, angle, w, r, g, b)
# 退回上个点画右枝, 最小分支长度规定为10
width(w)
pencolor(r % 200, g % 200, b % 200)
bk(length)
rt(angle * 2.0)
fd(length)
# 画当前右枝的下个左枝, 最小分支长度规定为10
if length > 10.0:
branch(length, angle, w, r, g, b)
# 退回并把方向转回上一分支的方向
width(w)
pencolor(r % 200, g % 200, b % 200)
bk(length)
lt(angle)


def main() -> None:
# 画快点
speed(0)
# 画框大点
setup(1200, 800)
# 设置画笔宽度
width(16)
# 设置色彩模式是RGB
colormode(255)
# 设置画笔颜色
pencolor(0, 0, 0)
# 把小海龟的方向调转为竖直向上
lt(90)
# 抬笔
pu()
# 后退
bk(340)
# 落笔
pd()
# 前进画树干
fd(180)
# 画树枝
branch()
# 防止画完后直接退出
done()


if __name__ == '__main__':
main()

运行过程

tree_mod.gif

运行结果

tree_mod

 评论